#include <iostream>
#include <vector>

using namespace std;
class Solution
{
    // a < b:
    // 1 + (a - b) >> 31 == 0
    // a > b:
    // 1 + (a - b) >> 31 == 1
public:
    int maximum(int a, int b)
    {
        //long 2^-64 - 2^63-1
        long ta = a, tb = b;
        int k = 1 + ((ta - tb) >> 63);
        return k * a + (!k) * b;
    }

    int maximum_2(int a, int b)
    {
        // 计算 int 类型的位数，避免不同系统下长度不同
        int bitlen = sizeof(a) * 8;

        // 计算 a 的符号位，b 的符号位
        // C/C++ 中负数右移最高位会补 1，因此需要转成无符号类型后再右移
        int asign = static_cast<unsigned>(a) >> (bitlen - 1);
        int bsign = static_cast<unsigned>(b) >> (bitlen - 1);
        // 假设 a 与 b 异号，计算 k 的值
        int k = asign ^ 1;

        // 当 a 和 b 异号时，asign ^ bsign ^ 1 为 0，由于 逻辑与运算 的短路性，将不再计算后半行代码，避免溢出
        // 当 a 和 b 同号时，asign ^ bsign ^ 1 为 1，此时会执行后半行代码，重新对 k 赋值
        int temp_cond = (asign ^ bsign ^ 1) && (k = static_cast<unsigned>(a - b) >> (bitlen - 1) ^ 1);
        return a * k + b * (k ^ 1);
    }

    int maximum_2(int a, int b)
    {
        long x = (long)a - (long)b;
        int k = (int)(x >> 63);
        return (1 + k) * a - b * k;
    }
};

int main()
{
    Solution s;
    int a = -2, b = 9;
    cout << s.maximum_2(a, b) << endl;
    return 0;
}